package com.qfedu.repo.db;

import java.sql.*;
import java.util.List;

/**
 * @author a1275872671
 * @version v1.0
 * @project QfeduJava2401
 * @package com.qfedu.repo.db
 * @company
 * @date 2024/5/8 10:40
 *
 * 该类为工具类 作用是 通过手写 代码 实现JDBC的数据库连接
 */
public class DBUtils {
    /**
     * jdbc 记载驱动
     * 建立数据库的连接 url、user、pwd、返回数据库的对象
     * 获取数据库的预编译执行pst对象
     * 执行数据库操作 int update (sql) 、ResultSet query(sql)
     * 根据结果处理
     * 关闭连接、释放
     * */
    private static final String MYSQL_DRIVER="com.mysql.cj.jdbc.Driver";
    private static final String MYSQL_URL ="jdbc:mysql://localhost:3306/repo?useSSL=false&characterEncoding=utf-8&serverTimezone=UTC";
    private static final String MYSQL_USER = "root";
    private static final String MYSQL_PWD="12345678";
    private static Connection conn=null;
    private static PreparedStatement pst=null;

    static {
        try {
            Class.forName(MYSQL_DRIVER);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }

    }
    public static Connection getCollection(){
        Connection connection=null;
        try {
          connection= DriverManager.getConnection(MYSQL_URL,MYSQL_USER,MYSQL_PWD);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return connection;
    }
    /**
     * 该方法用于执行数据库操作 ，接受俩个参数
     */
    public static int executeUpdate(String sql, PstCallback callback){
        conn=getCollection();
        int result=-1;
        if (conn!=null){
            //预编译sql语句
            try {
              pst=conn.prepareStatement(sql);
                //调用一系列pts的.set方法给？占位符赋值
                callback.pstSetValue(pst);
              result= pst.executeUpdate();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }finally {
                close();
            }

        }
        return result;
    }

    public static ResultSet query(String sql, PstCallback pstCallback){
            ResultSet result=null;
        try {
            conn=getCollection();
            pst=conn.prepareStatement(sql);
            //将pst对象回传给调用者，供调用者设置？对应的数据
            if(pstCallback!=null){
                pstCallback.pstSetValue(pst);
            }
            result=pst.executeQuery();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return result;
    }
    /**
     * 关闭资源
     * */
    public static void close(){
        try {
            if (pst!=null){
                pst.close();
            }
            if (conn!=null){
                conn.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
